package com.algorithm.liyc.greedy;

import java.util.ArrayList;
import java.util.List;

/**
 * 0763.划分字母区间
 * 字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段，同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。
 *
 * 在遍历的过程中相当于是要找每一个字母的边界，如果找到之前遍历过的所有字母的最远边界，说明这个边界就是分割点了。此时前面出现过所有字母，最远也就到这个边界了。
 *
 * 可以分为如下两步：
 * ● 统计每一个字符最后出现的位置
 * ● 从头遍历字符，并更新字符的最远出现下标，如果找到字符最远出现位置下标和当前下标相等了，则找到了分割点
 *
 * @author Liyc
 * @date 2024/1/29 17:38
 **/

public class Solution14 {

    public List<Integer> partitionLabels(String S) {
        char[] chars = S.toCharArray();
        int[] eges = new int[26];
        for (int i = 0; i < chars.length; i++) {
            eges[chars[i] - 'a'] = i;
        }

        int idx = 0;
        int last = 0;
        List<Integer> result = new ArrayList<>();
        for (int i = 0; i < chars.length; i++) {
            idx = Math.max(idx, eges[chars[i] - 'a']);
            if (idx == i) {
                result.add(i - last);
                last = i;
            }
        }
        return result;
    }
}
